package cn.wn.web;

import cn.wn.model.ResultInfo;
import cn.wn.pojo.User;
import cn.wn.service.UserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@Api(tags = "登陆模块")
@Slf4j
public class LoginController {

    /**
     * 登陆
     */
    @PostMapping("login")
    @ApiOperation(value = "登陆")
    public ResultInfo<String> login(@RequestBody User user){
        try {
            // 创建Subject对象，表示当前的用户，作为SecurityManager操作认证授权等功能的入口
            Subject subject = SecurityUtils.getSubject();
            // 创建token，封装用户输入的账号密码
            UsernamePasswordToken token =
                    new UsernamePasswordToken(user.getName(),user.getPassword());
            // 登陆认证 [关键代码]
            subject.login(token);

            // 获取认证后的身份对象（在realm的认证方法返回的对象的构造函数第一个参数指定的）
            User authcUser = (User) subject.getPrincipal();
            log.info("认证成功,身份对象：{}",authcUser);
            return ResultInfo.ok();
        } catch (AuthenticationException e) {
            log.error("认证失败！");
            e.printStackTrace();
            return ResultInfo.fail(e.getMessage());
        }
    }

    /**
     * 退出
     */
    @GetMapping("logout")
    @ApiOperation(value = "退出")
    public ResultInfo<String> logout(){
        // 通过subject的logout()方法删除认证用户数据
        SecurityUtils.getSubject().logout();
        return ResultInfo.ok();
    }

    /**
     * 显示登陆用户 （在aside.html中显示登陆用户名称）
     */
    @GetMapping("loginUser")
    public ResultInfo<User> loginUser(){
        // 获取登陆用户
        User user = (User) SecurityUtils.getSubject().getPrincipal();
        // 不返回id、password给前端
        //user.setId(null);
        //user.setPassword(null);
        return ResultInfo.ok(user.getName());
    }
}
